
在近幾年的技術社群中,「容器」與「Kubernetes」幾乎是同時被提及的關鍵字。許多人誤以為兩者是相同的概念,甚至會將「Kubernetes」等同於「Docker」。然而,事實上這是兩個不同層次的技術:
-
容器(Container) 是一種應用程式執行的封裝與隔離方式。
-
Kubernetes(K8s) 則是一個容器編排平臺,用來自動化管理與部署容器。
要真正理解這兩者之間的關係,需要從它們的定義、適用情境、技術演進,以及 Kubernetes 為什麼現在偏好 containerd 而非 Docker 開始探討。
什麼是容器(Container)?
容器是一種輕量級的虛擬化技術,基於 Linux 的 Namespace 與 Cgroups 機制,實現進程級別的隔離。簡單來說,容器讓應用程式可以在一個封閉的執行環境中運行,而這個環境包含應用所需的程式碼、函式庫、設定檔與依賴。
與傳統的 VM(虛擬機)不同,容器不需要模擬整個 OS,而是共用主機的 Kernel,因此啟動快、資源利用率高。
常見的 Container Runtime
- Docker:最早普及容器的代表性技術。
- containerd:CNCF 專案,輕量且專注於容器執行。
- CRI-O:專門為 Kubernetes 設計的容器執行時。
- Podman:無需 Daemon 的容器工具,強調安全性。
容器的使用情境
- 開發環境:快速啟動一個測試用的服務。
- 部署應用:保證開發與生產環境一致。
- CI/CD:透過容器映像檔(Image)打包應用,降低版本差異問題。
- 微服務:每個微服務獨立打包為容器,方便部署與擴展。
什麼是 Kubernetes(K8s)?
Kubernetes 是由 Google 開發、後來捐贈給 CNCF 的開源專案,是目前最流行的容器編排平臺。
它的核心能力是:
- 自動化部署容器
- 管理多節點叢集
- 提供自動擴展(Auto-scaling)
- 流量路由與負載平衡
- 自我修復(Self-healing)
- 滾動更新、金絲雀釋出
Kubernetes 的主要元件
- 大規模微服務部署:數十到數百個服務協同運作。
- 跨雲或混合雲環境:支援多個數據中心或雲供應商。
- 高可用架構:確保應用不中斷服務。
- DevOps / GitOps:結合 CI/CD,自動化部署。
容器與 Kubernetes
容器是基礎,Kubernetes 是管理層
容器解決的是「如何封裝與運行應用程式」,而 Kubernetes 解決的是「如何在大規模環境中自動化管理這些容器」。
單機 vs. 叢集
- 單機環境下,你可以用 Docker 直接啟動一個容器。
- 當系統有數十個容器,需要跨機器管理,就需要 Kubernetes 來協調。
相輔相成
容器提供一致的應用執行環境,Kubernetes 則提供統一的調度、擴展與治理。
從 Docker 到 containerd:Kubernetes 的容器執行時演進
為什麼以前 Kubernetes 使用 Docker?
在容器剛興起時,Docker 幾乎是唯一的選擇,開發者也習慣用 Docker CLI 來建立與管理容器。早期的 Kubernetes 透過 Docker Shim 與 Docker 整合。
為什麼 Kubernetes 不再使用 Docker?
自 Kubernetes 1.20 開始,官方宣布 棄用 Dockershim,原因包括:
-
Docker 不是僅僅一個容器,它還包含 CLI、API、Build 工具等,對 Kubernetes 來說過於複雜。
- Docker 本身使用 containerd 作為底層執行時,等於 Kubernetes 間接呼叫 containerd,效率較低。
- CNCF 生態:Kubernetes 希望使用符合 CRI(Container Runtime Interface) 標準的執行時,如 containerd、CRI-O。
為什麼選擇 containerd?
- 輕量化:containerd 專注於「拉取映像檔、管理容器生命週期」,沒有多餘的功能。
- CNCF 專案:與 Kubernetes 生態整合度高。
- 效能更佳:少了中間轉換層,容器啟動更快。
- 社群支持:廣泛應用於 GKE、EKS、AKS 等雲端服務。
Docker vs Containerd
項目 |
Docker |
Containerd |
定位 |
完整的容器平臺,包含 CLI、Build、Registry |
輕量級容器執行時 |
是否符合 |
CRI 不完全(需 Dockershim) |
原生支援 CRI |
功能範圍 |
Build、Run、Push、API、CLI |
Run、Pull、管理生命週期 |
與 K8s 整合 |
透過 Dockershim(已棄用) |
原生支援,官方推薦 |
適用情境 |
開發環境、單機操作 Kubernetes |
生產叢集 |
使用 Docker 與 containerd 的實務建議
- 開發階段 → Docker / Podman
1.1. 開發者仍可用 Docker CLI 來建構與測試容器映像檔,因為操作直覺,工具生態成熟。
1.2. 現在 Docker Desktop 可能要授權費用,所以建議選用 Podman
- 生產環境 → containerd / CRI-O
2.1. 在 Kubernetes 叢集內,建議使用 containerd 或 CRI-O,避免額外的轉換開銷。
- 混合策略
2.2. 本地:Docker for Desktop / Podman
2.3. 生產:containerd(Kubernetes 內建支援)
結語
-
容器 ≠ Kubernetes
容器是應用封裝與運行的單位,而 Kubernetes 是管理容器的平臺。
-
Docker ≠ Kubernetes
Docker 是容器技術的代表,但 Kubernetes 是容器編排工具。
-
Docker vs containerd
在 Kubernetes 生產環境中,Docker 已逐漸被 containerd 取代,原因在於效能、整合度與標準化。
-
實作建議
在開發環境,你仍然可以放心使用 Docker/Podman。
在 Kubernetes 正式環境,選擇 containerd 或 CRI-O 才是未來的主流。